package com.study.kt._01grammar._02oop

fun main() {
    //使用类的解构
    val fieldComponent = FieldComponent("fauks", 12, "男")

    //使用类的解构，将类中对应的属性一起赋值给多个变量(类需要实现componentN方法)
    val (name, age) = fieldComponent
    println("姓名：$name,年龄：$age")
    //如果不关注某个变量，可以使用_省略那个变量
    val (_, age2, sex) = fieldComponent
    println("性别：$sex,年龄：$age2")

    //类的解构在Map迭代中的使用
    val map = mutableMapOf<String, String>()
    map["a"] = "aaa"
    map["b"] = "bbb"
    for (entry in map) {
        //使用entry遍历map
    }
    //可以借助类的解构遍历map
    /**
     * map之所以可以实现如下遍历方法，因为map的entry中有两个解构方法
     *   1.operator fun <K, V> Map.Entry<K, V> component1 () = getKey()
     *   2.operator fun <K , V> Map.Entry<K, V>.component2 () = getValue()
     *
     *   即可以这样访问Entry对象：
     *    val (key,value)=map.entry
     */
    for ((key, value) in map) {
        println("$key===$value")
    }
}

//属性解构 componentN方法 实现解构声明
class FieldComponent(var name: String, var age: Int, var sex: String) {

    //定义componentN方法，用于解构
    operator fun component1(): String {
        return this.name
    }

    operator fun component2(): Int {
        return this.age
    }

    operator fun component3(): String {
        return this.sex
    }
}